package com.example.demo.enums;

import com.zhucan.enums.core.enums.CodeEnum;
import com.zhucan.enums.conversion.annotation.EnumAutoConverter;
import com.zhucan.enums.scanner.annotation.EnumScan;
import lombok.AllArgsConstructor;
import lombok.Getter;

/**
 * 订单状态枚举
 * 
 * 演示功能：
 * 1. @EnumScan - 启用枚举扫描，可以在码表API中查询
 * 2. @EnumAutoConverter - 自动生成数据库转换器
 * 3. CodeEnum接口 - 提供code和value方法用于转换
 * 
 * 使用场景：
 * - 数据库存储：存储为数字code值，节省空间
 * - JSON序列化：自动转换为code值传输
 * - MVC参数：前端传递code值，自动转换为枚举对象
 */
@Getter
@AllArgsConstructor
@EnumScan(
    description = "订单状态", 
    defaultEnumCode = 1,
    category = "Order"
)
@EnumAutoConverter
public enum OrderStatusEnum implements CodeEnum {
    
    /**
     * 待支付 - 订单已创建，等待用户支付
     */
    PENDING_PAYMENT(1, "待支付"),
    
    /**
     * 已支付 - 用户已完成支付，等待商家处理
     */
    PAID(2, "已支付"),
    
    /**
     * 备货中 - 商家正在准备商品
     */
    PREPARING(3, "备货中"),
    
    /**
     * 已发货 - 商品已发出，在配送途中
     */
    SHIPPED(4, "已发货"),
    
    /**
     * 已送达 - 商品已送达用户
     */
    DELIVERED(5, "已送达"),
    
    /**
     * 已完成 - 订单交易完成
     */
    COMPLETED(6, "已完成"),
    
    /**
     * 已取消 - 订单被取消
     */
    CANCELLED(7, "已取消"),
    
    /**
     * 退款中 - 正在处理退款
     */
    REFUNDING(8, "退款中"),
    
    /**
     * 已退款 - 退款已完成
     */
    REFUNDED(9, "已退款");

    /**
     * 枚举代码值 - 用于数据库存储和网络传输
     */
    private final Integer code;
    
    /**
     * 枚举显示名称 - 用于UI显示
     */
    private final String name;

    @Override
    public Integer code() {
        return this.code;
    }

    @Override
    public String value() {
        return this.name;
    }
    
    /**
     * 判断是否为最终状态（不可再变更）
     */
    public boolean isFinalStatus() {
        return this == COMPLETED || this == CANCELLED || this == REFUNDED;
    }
    
    /**
     * 判断是否可以取消
     */
    public boolean canCancel() {
        return this == PENDING_PAYMENT || this == PAID || this == PREPARING;
    }
    
    /**
     * 判断是否可以退款
     */
    public boolean canRefund() {
        return this == PAID || this == PREPARING || this == SHIPPED || this == DELIVERED || this == COMPLETED;
    }
}
